home *** CD-ROM | disk | FTP | other *** search
/ MacHack 1997 / MacHack 1997.toast / Presentations / Presentations ’97 / Sessions ’97 / Multiplatform Code⁄Data Sharing / HelloBothWorlds / GE / LibHdr / rects.h < prev    next >
Encoding:
C/C++ Source or Header  |  1996-01-09  |  2.5 KB  |  118 lines  |  [TEXT/CWIE]

  1. /*
  2.     Rects.h
  3.     
  4.     Rectangle handling routines for Graphic Elements
  5.     
  6.     Copyright 1993 by Al Evans. All rights reserved.
  7.     
  8.     10/18/93
  9.     
  10. */
  11.  
  12. #ifndef RECTS_H
  13. #define RECTS_H 
  14.  
  15. #ifndef PRELOAD
  16. #include "Preload.h"
  17. #endif
  18.  
  19. #include "List.h"
  20.  
  21. //Entry in a list of rectangles
  22. typedef struct rEntry *RListEntryPtr;
  23.  
  24. typedef struct rEntry {
  25.     RListEntryPtr        nextEntry;
  26.     Rect                thisRect;
  27. } RListEntry;
  28.  
  29. //Coding masks for overlapping rectangles, see CodeRects below
  30. /*
  31. typedef enum {    noOvlp =        0,
  32.                 ovlpTop =         1,
  33.                   ovlpLeft =        1 << 1,
  34.                 ovlpBottom =    1 << 2,
  35.                 ovlpRight =        1 << 3,
  36.                 ovlpTR =        1 << 4,
  37.                 ovlpTL =        1 << 5,
  38.                 ovlpBL =        1 << 6,
  39.                 ovlpBR =        1 << 7,
  40.                 uncoded =        1 << 8
  41.              } RectCode;
  42. */
  43.  
  44. enum {    noOvlp =        0,
  45.         ovlpTop =         1,
  46.         ovlpLeft =        1 << 1,
  47.         ovlpBottom =    1 << 2,
  48.         ovlpRight =        1 << 3,
  49.         ovlpTR =        1 << 4,
  50.         ovlpTL =        1 << 5,
  51.         ovlpBL =        1 << 6,
  52.         ovlpBR =        1 << 7,
  53.         uncoded =        1 << 8
  54.     };
  55.     
  56. typedef short RectCode;
  57.              
  58. #ifdef __cplusplus
  59. extern "C" {
  60. #endif
  61.  
  62.  
  63. //Returns a code as defined above showing how testRect overlaps baseRect
  64. RectCode CodeRect(const Rect* testRect, const Rect* baseRect);
  65.  
  66. /*
  67.     The following function is meant to be called iteratively until it returns
  68.     false. If code is non-zero, it returns rectangles in *src2 and *dst2 which
  69.     represent srcRect and dstRect "wrapped around" totalSource. It alters
  70.     the value of code, to reflect the fact that it has handled one case of 
  71.     "wraparound". If code is noOvlp, it clips srcRect against totalSource,
  72.     clips destRect accordingly, and returns the results in src2 and dst2.
  73. */
  74.  
  75. Boolean SplitRects(RectCode *code, const Rect* totalSource, const Rect* srcRect,
  76.         const Rect* dstRect, Rect* src2, Rect* dst2);
  77.  
  78.  
  79. //Rectangle list functions
  80.  
  81. //Returns new rectangle list
  82. LHeaderPtr InitRectList(short nRects);
  83.  
  84. Boolean InsertRectInList(LHeaderPtr listHead, Rect* theRect);
  85.  
  86. //Removes all rectangles from rectList
  87. void ClearRectList( LHeaderPtr rectList);
  88.  
  89. //For convenience
  90.  
  91. short RectHeight(Rect *r);
  92.  
  93. short RectWidth(Rect *r);
  94.  
  95.  
  96. //Fast assembly-language rectangle arithmetic
  97.  
  98. //IFF rects intersect, intersection is returned in rect2
  99. extern Boolean RectsIntersect(const Rect * rect1, Rect * rect2);
  100.  
  101. // rect2 = rect1 U rect2
  102. extern void RectUnion(Rect * rect1, Rect * rect2 );
  103.  
  104. // rect1->top = rect1->left = rect1->bottom = rect1->right = 0
  105. extern void RectZero(Rect * rect1);
  106.  
  107. // true IFF (rect1->top >= rect1->bottom) || (rect1->left >= rect1->right)
  108. extern Boolean RectEmpty(Rect * rect1);
  109.  
  110. // Offsets rect1 by dx, dy
  111. extern void RectOffset(Rect * rect1, long dx, long dy);
  112.  
  113. #ifdef __cplusplus
  114. }
  115. #endif
  116.  
  117. #endif
  118.